package com.xhg.util.mail;

import java.util.Date;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

/**
 * 邮件发送器 (带附件)
 * @author wjw
 */
public class SimpleMailSender  { 
	/** 
	  * 以文本格式发送邮件 
	  * @param mailInfo 待发送的邮件的信息 
	  */
	public boolean sendTextMail(MailSenderInfo mailInfo) { 
	  Properties pro = mailInfo.getProperties();
	  // 根据邮件会话属性和密码验证器构造一个发送邮件的session 
	  Session sendMailSession = Session.getDefaultInstance(pro,null);//不进行验证 
	  try { 
		  // 根据session创建一个邮件消息 
		  Message mailMessage = new MimeMessage(sendMailSession); 
		  // 创建邮件发送者地址 
		  Address from = new InternetAddress(mailInfo.getUserName()); 
		  // 设置邮件消息的发送者 
		  mailMessage.setFrom(from); 
		  // 创建邮件的接收者地址，并设置到邮件消息中 
		  Address[] tolist=new Address[mailInfo.toAddress.length];
		  int i=0;
		  for(String add:mailInfo.toAddress){
			  tolist[i++] = new InternetAddress(add);
		  }
		  //接收人地址
		  mailMessage.setRecipients(Message.RecipientType.TO, tolist);
		  //抄送人地址
		  if(mailInfo.ccAddress!=null&&mailInfo.ccAddress.length>0){
			  Address[] cclist=new Address[mailInfo.ccAddress.length];
			  i=0;
			  for(String add:mailInfo.ccAddress){
				  cclist[i++] = new InternetAddress(add);
			  }
			  mailMessage.setRecipients(Message.RecipientType.CC, cclist);
		  }
		  //密抄送人地址
		  if(mailInfo.bccAddress!=null&&mailInfo.bccAddress.length>0){
			  Address[] bcclist=new Address[mailInfo.bccAddress.length];
			  i=0;
			  for(String add:mailInfo.bccAddress){
				  bcclist[i++] = new InternetAddress(add);
			  }
			  mailMessage.setRecipients(Message.RecipientType.BCC, bcclist);
		  }
		  // 设置邮件消息的主题 
		  mailMessage.setSubject(mailInfo.getSubject()); 
		  // 设置邮件消息发送的时间 
		  mailMessage.setSentDate(new Date()); 
		  // 发送邮件 
		  Transport.send(mailMessage);
		  return true; 
	  } catch (MessagingException ex) { 
		  ex.printStackTrace(); 
	  } 
	  return false; 
	} 
	/** 
	  * 以HTML格式发送邮件 
	  * @param mailInfo 待发送的邮件信息 
	  */ 
	public boolean sendHtmlMail(MailSenderInfo mailInfo){
	  // 判断是否需要身份认证 
	  MyAuthenticator authenticator = null;
	  Properties pro = mailInfo.getProperties();
	  //如果需要身份认证，则创建一个密码验证器  
	  if (mailInfo.isValidate()) {
		authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
	  }
	  // 根据邮件会话属性和密码验证器构造一个发送邮件的session 
	  Session sendMailSession = Session.getDefaultInstance(pro,authenticator); 
	  try { 
		  // 根据session创建一个邮件消息 
		  Message mailMessage = new MimeMessage(sendMailSession); 
		  // 创建邮件发送者地址 
		  Address from = new InternetAddress(mailInfo.getUserName()); 
		  // 设置邮件消息的发送者 
		  mailMessage.setFrom(from); 
		  // 创建邮件的接收者地址，并设置到邮件消息中 
		  Address[] tolist=new Address[mailInfo.toAddress.length];
		  int i=0;
		  for(String add:mailInfo.toAddress){
			  tolist[i++] = new InternetAddress(add);
		  }
		  //接收人地址
		  mailMessage.setRecipients(Message.RecipientType.TO, tolist);
		  //抄送人地址
		  if(mailInfo.ccAddress!=null&&mailInfo.ccAddress.length>0){
			  Address[] cclist=new Address[mailInfo.ccAddress.length];
			  i=0;
			  for(String add:mailInfo.ccAddress){
				  cclist[i++] = new InternetAddress(add);
			  }
			  mailMessage.setRecipients(Message.RecipientType.CC, cclist);
		  }
		  //密抄送人地址
		  if(mailInfo.bccAddress!=null&&mailInfo.bccAddress.length>0){
			  Address[] bcclist=new Address[mailInfo.bccAddress.length];
			  i=0;
			  for(String add:mailInfo.bccAddress){
				  bcclist[i++] = new InternetAddress(add);
			  }
			  mailMessage.setRecipients(Message.RecipientType.BCC, bcclist);
		  }
		  // 设置邮件消息的主题 
		  mailMessage.setSubject(mailInfo.getSubject()); 
		  // 设置邮件消息发送的时间 
		  mailMessage.setSentDate(new Date()); 
		  // MiniMultipart类是一个容器类，包含MimeBodyPart类型的对象 
		  Multipart mainPart = new MimeMultipart(); 
		  // 创建一个包含HTML内容的MimeBodyPart 
		  BodyPart html = new MimeBodyPart(); 
		  // 设置HTML内容 
		  html.addHeader("Content-Type","text/html; charset=utf-8");
		  html.setContent(mailInfo.getContent(), "text/html;charset=utf-8"); 
		  mainPart.addBodyPart(html); 
		  // 将MiniMultipart对象设置为邮件内容 
		  mailMessage.setContent(mainPart); 
		  //附件
		  String[] files=mailInfo.attachFileNames;
		  if(files!=null&&files.length>0){
			  for(String f:files){
				// 建立第二部分：附件     
		          html = new MimeBodyPart();
		          // 获得附件
		          DataSource source = new FileDataSource(f);
		          //设置附件的数据处理器
		          html.setDataHandler(new DataHandler(source));
		          // 设置附件文件名
		          html.setFileName(f);
		          // 加入第二部分
		          mainPart.addBodyPart(html);
			  }
		  }
		  // 发送邮件 
		  Transport.send(mailMessage);
		  return true; 
	  } catch (MessagingException ex) { 
		  ex.printStackTrace(); 
	  } 
	  return false; 
	} 
} 

